package gameengine;

import java.awt.geom.*;
import java.awt.*;
import java.util.*;

/**
 * Implementa a fisica (calculos e etc)
 * @author Vitor
 */
public class PhysicsManager
{
    //Constante gravitacional
    final static float Gravity = 1.0f;
    //Constante do arrasto do ar
    final static float Drag =  0.0f;
    
    private static Dimension dimensao = new Dimension();
    private static Vector<SpriteEstaticaFisica> spritesAAtualizar = new Vector<SpriteEstaticaFisica>();
    
    private PhysicsManager()
    {
        //transformando a classe em estatica para n fazer porquice
        //pqp como java é porco
    }
    
    /**
     * Calcula as novas posicoes de objetos fisicos
     * @author Vitor
     * @param objetoFisico
     */
    public static void Update(IObjetoFisico objetoFisico)
    {
        Point2D posicaoAtual = objetoFisico.GetPosicao2D();
        
        float velocidadeNovaX = objetoFisico.GetVelocidadeX() - Drag;
        float velocidadeNovaY = objetoFisico.GetVelocidadeY() + Gravity;
        
        Point2D posicaoNova = new Point2D.Float((float)posicaoAtual.getX() + velocidadeNovaX, (float)posicaoAtual.getY() + velocidadeNovaY);
        
        objetoFisico.SetVelocidadeX(velocidadeNovaX);
        objetoFisico.SetVelocidadeY(velocidadeNovaY);
        
        objetoFisico.SetPosicao2D(posicaoNova);
        
        if(objetoFisico instanceof SpriteEstaticaFisica)
        {
            SpriteEstaticaFisica sprite = (SpriteEstaticaFisica)objetoFisico;
            if(sprite.GetPosicao2D().getY()>dimensao.getHeight() || sprite.GetPosicao2D().getX()>dimensao.getWidth() || sprite.GetPosicao2D().getX()<0)
            {
                spritesAAtualizar.remove(sprite);
            }
            sprite.SetPosicao((int)sprite.GetPosicao2D().getX(), (int)sprite.GetPosicao2D().getY());
        }
    }
    
    public static void AddSprite(SpriteEstaticaFisica sprite)
    {
        spritesAAtualizar.add(sprite);
    }
    
    public static void SetDimension(double width, double height)
    {
        dimensao.setSize(width, height);
    }
    
    public static boolean containsSpriteFisica(SpriteEstaticaFisica sprite)
    {
        return spritesAAtualizar.contains(sprite);
    }
}
